﻿using SqlSugar;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Zhaoxi.SqlSugar.Common;
using Zhaoxi.SqlSugar.Models;

namespace Zhaoxi.SqlSugarAdvanced
{
    /// <summary>
    /// 过滤器与软删除示例
    /// </summary>
    public class FilterInfo
    {
        /// <summary>
        /// 过滤器与软删除示例 - 用于配置查询的过滤条件
        /// </summary>
        public static void Show()
        { 
            ConnectionConfig connectionConfig = new ConnectionConfig() // 连接配置
            {
                ConnectionString = CustomConnectionConfig.ConnectionString001, // 主库连接字符串
                IsAutoCloseConnection = true, // 是否自动关闭连接
                DbType = DbType.SqlServer // 数据库类型
            };
            using (SqlSugarClient db = new SqlSugarClient(connectionConfig)) // 创建SqlSugarClient实例
            {
                //输出Sql语句
                db.Aop.OnLogExecuting = (s, p) => // 在执行SQL语句时触发
                {
                    Console.WriteLine("----------------------------");
                    Console.WriteLine($"Sql语句:{s}");
                };

                //配置表过滤器 - 用于配置查询的过滤条件 - 全局生效
                db.QueryFilter.Add(new TableFilterItem<StudentInfo>(it => it.Name.Contains("名称"))); // 添加过滤条件，查询时Name包含"名称"的记录

                //查询有效 
                List<StudentInfo> resultlist = db.Queryable<StudentInfo>() // 查询StudentInfo表
                    .ToList(); // 执行查询并返回结果列表

                //删除也有效
                db.Deleteable<StudentInfo>() // 删除StudentInfo表
                    .EnableQueryFilter() // 启用查询过滤器
                    .Where(it => it.Id == 15) // 条件：Id等于15
                    .ExecuteCommand(); // 执行删除命令

                //逻辑删除 请升级到5.0.4.9+

                //实体属性有isdelete或者isdeleted
                //假删除 软删除
                db.Deleteable<StudentInfo>() // 删除StudentInfo表
                    .In(20) // 条件：Id等于20
                    .IsLogic() // 启用逻辑删除 - 启用软删除 - 需要在实体类中定义IsDeleted属性
                    .ExecuteCommand(); // 执行删除命令

                //指定属性
                db.Deleteable<StudentInfo>() // 删除StudentInfo表
                    .In(21) // 条件：Id等于21
                    .IsLogic() // 启用逻辑删除 - 启用软删除
                    .ExecuteCommand("Isdeleted"); // 执行删除命令，并指定属性Isdeleted

                //指定属性并且修改时间
                db.Deleteable<StudentInfo>() // 删除StudentInfo表
                    .In(22) // 条件：Id等于22
                    .IsLogic() // 启用逻辑删除 - 启用软删除
                    .ExecuteCommand("Isdeleted", 1, "CreateTime"); // 执行删除命令，并指定属性Isdeleted和CreateTime
            }
        }
    }
}
